package com.zzyl.intercept;

import cn.hutool.core.collection.CollUtil;
import com.zzyl.properties.JwtTokenProperties;
import com.zzyl.utils.JwtUtil;
import com.zzyl.utils.ThreadLocalUtil;
import io.jsonwebtoken.Claims;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 移动端拦截器，用于验证请求中的 JWT 令牌
 */
@Component
public class MobileInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtTokenProperties jwtTokenProperties;

    /**
     * 在请求处理之前执行的方法
     *
     * @param request  HttpServletRequest 对象
     * @param response HttpServletResponse 对象
     * @param handler  处理器对象
     * @return 如果验证通过返回 true，否则返回 false
     * @throws Exception 抛出异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求头中的授权令牌
        String token = request.getHeader("authorization");

        // 检查令牌是否为空
        if (StringUtils.isEmpty(token)) {
            // 如果令牌为空，设置响应状态为 401 未授权，并返回 false
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        System.out.println(token+"7777777777777777");
        // 解析 JWT 令牌
        Claims claims = JwtUtil.parseJWT(jwtTokenProperties.getBase64EncodedSecretKey(), token);
        // 检查解析结果是否为空或无效
        if (claims == null || claims.isEmpty()) {
            // 如果解析结果无效，设置响应状态为 401 未授权，并返回 false
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        System.out.println(claims+"-----------------");
        // 从解析结果中获取用户 ID
        Long id = claims.get("id",Long.class);
        
        // 将用户 ID 存储到 ThreadLocal 中
        ThreadLocalUtil.set(id);

        // 验证通过，继续处理请求
        return true;
    }

    /**
     * 在请求处理之后，视图渲染之前执行的方法
     *
     * @param request  HttpServletRequest 对象
     * @param response HttpServletResponse 对象
     * @param handler  处理器对象
     * @param modelAndView 视图模型对象
     * @throws Exception 抛出异常
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 清除 ThreadLocal 中存储的用户 ID
        ThreadLocalUtil.remove();
    }
}
